# 生成器 自定义迭代器
# 通过yield关键字实现多个返回值

def func():  # 直接调用函数没有任何作用
    print("第1次")
    yield 1  # yield 返回值
    print("第2次")
    yield 2
    print("第3次")
    yield 2
    print("第4次")


# 调用含有yield的函数生成 生成器
g = func()
print(g)
# 生成器.__next__会触发函数体运行 返回yield后面的值
print(g.__next__())
print(g.__next__())
print(g.__next__())

# len("aaa")="aaa".__len__()
# next(可迭代对象)=可迭代对象.__next__
# iter(可迭代对象)=.__iter__

print("===========")


# 例 自定义 range
def my_range(start, end, step=1):
    while start < end:
        yield start
        start += step


for i in my_range(1, 5, 2):
    print(i)


# yield表达式

def eat(name):
    while True:
        print("%s 准备吃东西了" % name)
        food = yield None  # 返回None值 ，并把send的值赋给food
        print("%s 吃了 %s" % (name, food))


g = eat("dog")
g.send(None)  # send(None) 等同于 __next__() 第一次send必须为None
g.send("肉")
g.send("骨头")
g.close() # 关闭生成器
